The use of server-based applications from remote clients over a network has become ubiquitous. With the widespread use of diverse server applications, different needs for input devices such as a network interface controller for data received through the network to the server have arisen. Various applications that use data stored in server memory interrupt the processor when they need to access the data. Since interrupts to a processor for accessing data are computationally expensive, it is desirable to interrupt a processor on a server only when necessary. By way of example only, one type of application uses data protocols (e.g., File Transfer Protocol (FTP) or Hyper Text Transfer Protocol (HTTP)) with high throughput where it is possible to receive and store large numbers of packets before sending to a processor to handle the packets. In this case, many packets may be collected over the network and may be coalesced before sending to the processor.
Some types of data can involve numerous accesses because acknowledgements can be sent before sending the next amount of data over a network. Based on current network data transfer protocols such as the Common Internet File Sharing (CIFS) protocol or the Network File Sharing (NFS) protocol, data files are typically broken up into different requests to send smaller increments of the data file due to the local area network protocols for file transfer that are adapted to wide area networks. In such a situation, the client requesting the data file will issue a single request for the first part of the requested file and wait for an acknowledgement and then issue a subsequent request and so forth until the data file is received. Thus, it is desirable for a receiving server processor to handle packets frequently to decrease latency time.
Recently, servers have been expanded to run multiple diverse applications on different processors. Such different applications may handle different types of data and conventional network interface controllers create an inefficient handling of different types of data packets they are not optimally configured for. For example, a network interface controller configured for high throughput data such as HTTP will create unacceptably high latency periods due to the interrupt coalescing when handling CIFS packets. Conversely, a network interface controller configured for low latency data such as CIFS packets will create high switching overhead and processing time by sending unnecessary interrupts, thus reducing throughput when handling HTTP packets.
Current network interface controller devices present themselves as single monolithic devices to system software. Such network interface controller devices are managed by a single device driver, which is common to all applications, that accesses the direct memory access channel in a host computer system. In emerging virtualized systems with multi-core, multi-operating system, and/or multi-application architectures, the current network interface controller devices have certain inefficiencies. For example, access to the network interface controller device is handled by a single device driver, with access controlled by a hypervisor or similar supervising piece of software. The single device driver accessing direct memory access (DMA) channels by way of a supervising software or hardware becomes both a performance bottle neck and contributor to system and software complexity, and thus, leads to inefficiencies in virtualized systems.